<?php

/**
 * 文件管理的基础模型，负责文件的添加，删除
 * @author ht
 *
 */
namespace Home\Model;

use Think\Model;

class FileModel extends Model {
	protected $tableName = 'file';
	/**
	 * 接收一个用户上传表单	$_FILES['file']
	 * 保存文件到UPLOAD_FILE_ROOT，常量定义的目录
	 *
	 * @param array $upfile $_FILES['file']
	 * @param string $subName $this->userInfo['user_id'].'_img'
	 * @param int $minWidth 生成缩略图的宽(不设置就不生成缩略图)
	 * @return int
	 */
	public function write($upfile,$subName, $userInfo,$minWidth=null,$minHight=null) {
		// 权限验证
		if (empty ( $upfile ) || empty ( $subName ) || empty ( $userInfo )) {
			print_r($upfile);
			$this->error = '参数错误';
			return 0;
		}
		
		// 上传文件
		$upload = new \Think\Upload (); // 实例化上传类
		$upload->maxSize = 512000; // 设置附件上传大小500kb
		$upload->mimes = array('image/jpeg','image/png');
		$upload->rootPath = UPLOAD_FILE_ROOT; // 设置附件上传根目录
		$upload->autoSub = true;
		$upload->subName = $subName; // 保存目录
		                             // 上传单个文件
		$info = $upload->uploadOne ( $upfile );
		if (! $info) { // 上传错误提示错误信息
			$this->error = '文件上传错误'.$upload->getError ();
			return 0;
		}
		// 上传成功 获取上传文件信息
		$uppath = UPLOAD_FILE_ROOT.$info ['savepath'].$info['savename'];//上传后的完整路径
		// 检测文件的sha1值，是否已经上传同一个文件
		
		$r = $this->where ( array (
				'sha1' => $info ['sha1'] 
		) )->find ();
		if (! empty ( $r )) {
			// 数据库里面有这个文件的信息，直接返回数据库里的信息，并删除当前上传的文件
			unlink ( $uppath ); // 删除文件
			return $r ['file_id'];
		}
		//
		// 没有这个文件，把信息保存到数据库
			//生成缩略图
			if(!empty($minWidth)){
				$this->mkThumbnail($uppath,$uppath.'.min',$minWidth,$minHight);
			}
			
		$data = array (
				'user_id' => $userInfo ['user_id'],
				'name' => $info ['name'],
				'size' => $info ['size'],
				'type' => $info ['type'],
				'md5' => $info ['md5'],
				'sha1' => $info ['sha1'],
				'savename' => $info ['savename'],
				'minname'  => $info ['savename'] . 'min',
				'savepath' => $info ['savepath'] 
		);
		if ($this->create ( $data )) {
			$ar = $this->add ();
			if (!empty ( $ar )) {
				return $ar;
			} else {
				unlink ( $uppath ); // 操作失败，文件上传回滚：删除文件
				$this->error = '把数据添加到数据库失败';
				return 0;
			}
		} else {
			// 操作失败，文件上传回滚：删除文件
			$this->error = '数据验证失败，取消数据添加';
			return 0;
		}
	}
	/**
	 * 通过文件ID打开文件，返回文件打开后的句柄
	 * 
	 * @param number $fileid        	
	 * @return boolean resource
	 */
	public function open($fileid) {
		if (empty ( $fileid )) {
			$this->error = '参数错误';
			return false;
		}
		
		// 检索数据库
		$r = $this->where ( array (
				'file_id' => $fileid 
		) )->find ();
		if (empty ( $r )) {
			$this->error = '没有数据';
			return false;
		}
		
		// 打开文件
		$fh = fopen ( $r ['savepath'], 'r' );
		if ($fh) {
			return $fh;
		} else {
			$this->error = '文件打开失败';
			return false;
		}
	}
	/**
	 * 删除文件
	 * 
	 * @param unknown $fileid        	
	 * @return boolean number
	 */
	public function del($fileid) {
		if (empty ( $fileid )) {
			$this->error = '参数错误';
			return false;
		}
		// 检索数据库
		$r = $this->where ( array (
				'file_id' => $fileid 
		) )->find ();
		if (empty ( $r )) {
			$this->error = '没有数据';
			return false;
		}
		// 删除数据库
		$this->startTrans ();
		$dr = $this->where ( array (
				'file_id' => $fileid 
		) )->delete ();
		if (empty ( $dr )) {
			$this->error = '数据库操作失败';
			$this->rollback ();
			return 0;
		}
		// 删除文件
		$fh = unlink ( $r ['savepath'] );
		if ($fh) {
			$this->commit ();
			return $fh;
		} else {
			$this->rollback ();
			$this->error = '文件删除失败';
			return false;
		}
	}
	/** 
	 * 生成缩略图函数（支持图片格式：gif、jpeg、png和bmp） 
	 * @author ruxing.li 
	 * @param  string $src      源图片路径 
	 * @param  string $filename 保存路径（必须指定路径） 
	 * @param  int    $width    缩略图宽度（只指定高度时进行等比缩放） 
	 * @param  int    $width    缩略图高度（只指定宽度时进行等比缩放） 
	 * @return bool 
	 */
	protected function mkThumbnail($src, $filename, $width = null, $height = null) {  
	    if (!isset($width) && !isset($height))  
	        return false;  
	    if (isset($width) && $width <= 0)  
	        return false;  
	    if (isset($height) && $height <= 0)  
	        return false;  
	  
	    $size = getimagesize($src);  
	    if (!$size)  
	        return false;  
	  
	    list($src_w, $src_h, $src_type) = $size;  
	    $src_mime = $size['mime'];  
	    switch($src_type) {  
	        case 1 :  
	            $img_type = 'gif';  
	            break;  
	        case 2 :  
	            $img_type = 'jpeg';  
	            break;  
	        case 3 :  
	            $img_type = 'png';  
	            break;  
	        case 15 :  
	            $img_type = 'wbmp';  
	            break;  
	        default :  
	            return false;  
	    }  
	  
	    if (!isset($width))  
	        $width = $src_w * ($height / $src_h);  
	    if (!isset($height))  
	        $height = $src_h * ($width / $src_w);  
	  
	    $imagecreatefunc = 'imagecreatefrom' . $img_type;  
	    $src_img = $imagecreatefunc($src);  
	    $dest_img = imagecreatetruecolor($width, $height);  
	    imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $width, $height, $src_w, $src_h);  
	  
	    //保存到文件
	    $imagefunc = 'image' . $img_type;  
		$imagefunc($dest_img, $filename);  

	    imagedestroy($src_img);  
	    imagedestroy($dest_img);  
	    return true;  
	}  
}
?>